package com.cloud.lan.entity.utils;

import com.cloud.lan.entity.base.BaseResponse;
import com.cloud.lan.entity.base.exceptions.BaseException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.Serializable;
import java.time.LocalDateTime;

import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * 场景字符规则验证器
 * @author ErKang
 * @date Created in 2021/4/29 14:21
 * @title VocUtil.java
 * Department: Product development
 */
public class VocUtil implements Serializable {

    public static final String WRONGFUL = "不合法！"; // 不合法

    private static final long serialVersionUID = 1L;

    /**
     * 日志对象
     */
    private static Logger log = LoggerFactory.getLogger(VocUtil.class);

    /**
     * 字符串验证器
     * @author ErKang
     */
    public static void ValidatorObj(VEntity entity) {
        try {
            /**
             * 验证数字长度 0开始到指定长度
             * @author ErKang
             */
            if (ObjectUtil.isNotNull(entity.getGeneral()) && ObjectUtil.isNotNull(entity.getLength())) {
                Validator.validateGeneral(entity.getGeneral(), 0, entity.getLength(), "数字长度超出范围" + WRONGFUL + "长度不超过：" + entity.getLength());
            }

            /**
             * 验证数字可用范围目前是0-24
             * @author ErKang
             */
            if (ObjectUtil.isNotNull(entity.getRangeNumber())) {
                Validator.validateBetween(Integer.valueOf(entity.getRangeNumber()), 0, 24, "数字范围" + WRONGFUL + "错误值：" + entity.getRangeNumber());
            }

            /**
             * 验证是否为可用邮箱地址
             * @author ErKang
             */
            if (ObjectUtil.isNotNull(entity.getEmail())) {
                Validator.validateEmail(entity.getEmail(), "邮箱" + WRONGFUL + "错误值：" + entity.getEmail());
            }

            /**
             * 验证是否为手机号码（中国）
             * @author ErKang
             */
            if (ObjectUtil.isNotNull(entity.getMobile())) {
                Validator.validateMobile(entity.getMobile(), "手机号" + WRONGFUL + "错误值：" + entity.getMobile());
            }

            /**
             * 验证是否为身份证号码（18位中国）
             * 出生日期只支持到到2999年
             * @author ErKang
             */
            if (ObjectUtil.isNotNull(entity.getIdCard())) {
                Validator.validateCitizenIdNumber(entity.getIdCard(), "身份证号码" + WRONGFUL + "错误值：" + entity.getIdCard());
            }

            /**
             * 中文字符验证
             * @author ErKang
             */
            if (ObjectUtil.isNotNull(entity.getChinese())) {
                Validator.validateChinese(entity.getChinese(), "名字只能是中文" + WRONGFUL + "错误值：" + entity.getChinese());
            }
        } catch (Exception e) {
            log.info("字符串验证器异常 [{}]", entity);
            throw new BaseException(BaseResponse.ERROR, e.getMessage());
        }
    }

    /**
     * 对象检测 指定字段是否为空
     * @author ErKang
     * @return void
     * 2019-03-13 16:16
     */
    public static void checkNullAttribute(String[] str, String[] val) {
        if (null == str[0]) {
            throw new BaseException(BaseResponse.ERROR, String.format("缺少参数:【%s】不能为空或NULL", val[0]));
        } else {
            for (int i = 0; i < str.length; i++) {
                if (null == str[i] || StrUtil.isEmpty(str[i].trim()) || str[i].trim().equals("null")) {
                    log.info("参数验证工具：参数[{}]不能为空或NULL！操作时间[{}]", val[i], LocalDateTime.now());
                    throw new BaseException(BaseResponse.ERROR, String.format("缺少参数:【%s】不能为空或NULL", val[i]));
                }
            }
        }
    }

    /**
     * 对象检测 指定字段是否为空
     * @author ErKang
     * @return void
     * 2019-03-13 16:16
     */
    public static void checkNullAttribute(String[] str, String[] val, String code) {
        if (null == str[0]) {
            throw new BaseException(StrUtil.isNotBlank(code) ? code : BaseResponse.ERROR, String.format("缺少参数:【%s】不能为空或NULL", val[0]));
        } else {
            for (int i = 0; i < str.length; i++) {
                if (null == str[i] || StrUtil.isEmpty(str[i].trim()) || "null".equals(str[i].trim())) {
                    log.info("参数验证工具：参数[{}]不能为空或NULL！操作时间[{}]", val[i], LocalDateTime.now());
                    throw new BaseException(StrUtil.isNotBlank(code) ? code : BaseResponse.ERROR, String.format("缺少参数:【%s】不能为空或NULL", val[i]));
                }
            }
        }
    }

    /**
     * 使用方式
     * @author ErKang
     * @return void
     * 2021/11/16 19:07
     */
    public static void main(String[] args) {
//        VocUtil.checkNullAttribute();
//        VocUtil.ValidatorObj(VEntity.rangeNumber("25"));
        VocUtil.ValidatorObj(VEntity.mobile("13813948485"));
        Validator.validateGeneral("123", 0, 1, "数字长度超出范围" + WRONGFUL);
    }

    @Data
    @EqualsAndHashCode(callSuper = false)
    @Accessors(chain = true)
    public static class VEntity implements Serializable {

        private static final long serialVersionUID = 1L;

        private String email;

        private String mobile;

        private String idCard;

        private String chinese;

        private String number;

        private String rangeNumber;

        private Integer length;

        private String general;

        /**
         * <pre>
         * 验证数字长度 0开始到指定长度
         * </pre>
         */
        public static VEntity general(String general, Integer length) {
            return new VEntity().setGeneral(general).setLength(length);
        }

        /**
         * <pre>
         * 验证是否为可用邮箱地址
         * </pre>
         */
        public static VEntity rangeNumber(String rangeNumber) {
            return new VEntity().setRangeNumber(rangeNumber);
        }

        /**
         * <pre>
         * 验证是否为可用邮箱地址
         * </pre>
         */
        public static VEntity email(String email) {
            return new VEntity().setEmail(email);
        }

        /**
         * <pre>
         * 验证是否为手机号码（中国）
         * </pre>
         */
        public static VEntity mobile(String mobile) {
            return new VEntity().setMobile(mobile);
        }

        /**
         * <pre>
         * 验证是否为身份证号码（18位中国）
         * 出生日期只支持到到2999年
         * </pre>
         */
        public static VEntity idCard(String idCard) {
            return new VEntity().setIdCard(idCard);
        }

        /**
         * <pre>
         * 中文字符验证
         * </pre>
         */
        public static VEntity chinese(String chinese) {
            return new VEntity().setChinese(chinese);
        }

        /**
         * <pre>
         * 数字验证
         * </pre>
         */
        public static VEntity number(String number) {
            return new VEntity().setNumber(number);
        }
    }
}
